/**
 * 可迭代对象
 * 与迭代器的概念不一样
 * 当一个对象实现了iterable protocol协议时，它就是一个可迭代对象
 * 可迭代对象要求是必须实现 @@iterator 方法，在代码中使用Symbol.iterator访问该属性，该方法返回一个迭代器
 * for-of操作符本质就是调用了 @@iterator 方法
 */

const iterableObj = {
  names: ['jack', 'josh', 'mike'],
  [Symbol.iterator]: function () {
    let index = 0
    return {
      next: () => {
        if (index < this.names.length) {
          return { done: false, value: this.names[index++] }
        } else {
          return { done: true, value: undefined }
        }
      },
    }
  },
}

const iterator1 = iterableObj[Symbol.iterator]()
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())
console.log(iterator1.next())

//for...of的操作对象必须是一个可迭代对象
for (const item of iterableObj) {
  console.log(item)
}
